#!/usr/bin/perl
use Getopt::Long;
use POSIX qw(strftime);
use Fcntl ':flock';

# Asegurarse que no hayan otros comandos ejecutándose
INIT
{
        die "Impossible de iniciar$0\n" unless (open ME, $0);
        die "Liste ya tiene un proceso en marcha !!\n" unless(flock ME, LOCK_EX|LOCK_NB);
}

# Chequear que las variables de ambiente estén inicializadas
if ( $ENV{'AMBIENTEINIT'}  eq ""){
         print "El ambiente no esta inicializado!\n";
      exit;
}


# Environnment variables
#$MAEDIR = "dossierMAEDIR";
#$REPODIR = "dossierREPODIR";
$MAEDIR= $ENV{'MAEDIR'}  ;
$REPODIR=$ENV{'REPODIR'}   ;

$exp_output_path = $REPODIR."/exp_output";
$camaras_path = $MAEDIR."/camaras.dat";
$tribunales_path = $MAEDIR."/pjn.dat";
$report_path = $REPODIR;

#Arguments 
my $verbose =  true;
my ($pedidos, $informes, @camaras, @tribunales, @expedientes, @estados, @saldos, $help, $report,$input) = ();

GetOptions( 
        'pedidos|p'  => \$pedidos,  # modo pedidos  
        'informes|i'  => \$informes,  # modo informes 
        'camara|c=s{1,}' => \@camaras, #filtrar por camaras
        'tribunal|t=s{1,}' => \@tribunales, #filtrar por tribunales
        'expediente|ex=s{1,}' => \@expedientes, #filtrar por expedientes
        'estado|es=i{1,7}' => \@estados, #filtrar por estados
        'saldo|s=s{1,2}' => \@saldos, #filtrar por saldo
        'tipo=s{1,4}' => \@tipos, #filtrar por tipo de pedidos
        'urgencia|u=i{1,4}' =>\@urgencias, #filtrar por urgencias
        'help|h'  => \&usage,  # help 
        'verbose|v!' => \$verbose,  # para ver la salida por pantalla
        'report|r=s'    => \$report,  # para generar la salida por archivo
		'input|inp=s'    => \$input,  # para eligir el archivo input
) or die "Uso incorrecto, por favor consulte la ayuda con el flag -h! \n";


#Chequear la compatibilidad de las opciones

if(defined($input)){
		if  (-e $input){
			$exp_output_path  = $input;
		}
		else{
			print "ERROR: El archivo "."$input"." no existe \n";
			exit;
		}
}

if ($informes==$pedidos){
        error();
}
else{
        if($informes=="1"){
                informes_elaboracion();
        }
        else{
                pedidos_elaboracion();
        }       
}

sub contiene{
        my($campo, @campos) = @_;

        $contiene = 0; # pongo el valor de 'contiene' como false
        foreach $c ( @campos ){
                if( $c eq $campo ) {
                # si lo contiene, entonces $contiene = 1 = true y salgo del loop
                $contiene = 1;
                last;           
                }
        }
        return($contiene);
}

sub identificarEstado {
        my ($estado) = @_;
        if( $estado eq "REMITIDO" ){ return 1;}
        if( $estado eq "A DESPACHO" ){ return 2;}
        if( $estado eq "EN CASILLERO" ){ return 3;}
        if( $estado eq "SIN CUENTA ASOCIADA" ){ return 4;}
        if( $estado eq "CUMPLIMIENTO" ){ return 5;}
        if( $estado eq "EN GESTION" ){ return 6;}
        if( $estado eq "N/D" ){ return 7;}
        if( $estado eq "" ){ return 0;}
        return 9;
}

#generacion de informes
sub informes_elaboracion(){
        #imprime el archivo "exp_output"
        open(my $exp_output_desc, '<', $exp_output_path) or die "Could not open "."$exp_output_path"."($!)\n";
        while(my $exp_output = <$exp_output_desc>){
                chomp $exp_output;
                my @fields = split(/;/, $exp_output);

                #chequeo que los campos del registro de exp_output cumplan con el filtro
                if( @camaras ) {
                        if ( &contiene( $fields[0], @camaras) == 0) {next;}
                }
                if( @tribunales ) {
                        if ( &contiene( $fields[1], @tribunales) == 0 ) {next;}
                }
                if( @expedientes ){
                        if ( &contiene( $fields[2], @expedientes) == 0 ) {next;}
                }
                if( @estados ) {
                        my $estado = identificarEstado($fields[4]);
                        if( $estado eq 0 ) { if($verbose){print "ERROR EN LA DEFINICION DEL ESTADO DEL REGISTRO. campo 'estado informado' vacio\n"; next;}}
                        if( $estado eq 9 ) {if($verbose){ print "ERROR EN LA DEFINICION DEL ESTADO DEL REGISTRO. '$fields[4]'  no reconocido\n"; next;}}
                        if ( &contiene( $estado, @estados ) == 0) {next;}
                }
                if( @saldos ){
                        # chequeo si el saldo es vacio. si no esta vacio, entonces lo descarto
                        if( $saldos[0] eq "sin" ){ if( $fields[6] ) { next; } }
                        # chequeo si el saldo es menor a los valores del filtro. si es mayor, entonces lo descarto
                        elsif( $saldos[0] eq "mn" ){ if( $fields[6] > $saldos[1] || !($fields[6]) ) { next; } }
                        # chequeo si el saldo es mayor a los valores del filtro. si es menor, entonces lo descarto
                        elsif( $saldos[0] eq "mj" ){ if( $fields[6] < $saldos[1] ) { next; } }
                        # cheque si es menor al valor mas chico o es mayor al valor mas grande, en ese caso no pasa el filtro
                        else { if( ($fields[6] < $saldos[0]) || ($fields[6] > $saldos[1]) ) { next; } }
                }
                # si paso todos los filtros, entonces lo concateno a la salida
                $salida .= "$exp_output\n";
        }
        close(DATA);
		if($verbose){print ($salida);}
		if(defined($report)){report_elaboracion('informe');}
}

sub identificarTipo{
        my($accion) = @_;
        if( index($accion, "EMBARGAR") ne -1 ) { return ("embargo"); }
        if( index($accion, "RECLAMO") ne -1 ) { return ("informacion"); }
        if( index($accion, "LIBERAR") ne -1 ) { return ("liberacion"); }
        if( ( index($accion, "ASIGNAR") ne -1) || (index($accion, "ASIGNACION") ne -1) ) { return ("asignacion"); }
        if($verbose){print "$accion: tipo de pedido no identificado\n";}
        return -1;
}

sub identificarUrgencia{
        my($accion) = @_;
        if( index($accion, "URGENTE") ne -1 ) { return (0); }
        if( index($accion, "ESTANDAR") ne -1 ) { return (1); }
        if( index($accion, "48") ne -1 ) { return (2); }
        if( index($accion, "72") ne -1 ) { return (3); }
        if( index($accion, "96") ne -1 ) { return (4); }
        if($verbose){print "$accion: urgencia del pedido no identificada\n";}
        return -1;
}

#generacion de pedidos
sub pedidos_elaboracion(){

        # Camaras descripciones
        my %_camaras = ();
        my @camara_fields;
        open(my $camaras_desc, '<', $camaras_path) or die "Could not open camaras.dat ($!)\n";
        while(my $camara = <$camaras_desc>){
                chomp $camara;
                @camara_fields = split(/;/, $camara);
                $_camaras{$camara_fields[0]} = $camara_fields[1];
        }
        close(DATA);

        # Tribunal esdescripciones
        my %_tribunales = ();
        my @tribunal_fields;
        open(my $tribunal_desc, '<', $tribunales_path) or die "Could not open pjn.dat ($!)\n";
        while(my $tribunal = <$tribunal_desc>){
                chomp $tribunal;
                @tribunal_fields = split(/;/, $tribunal);
                
                # si el 2do nivel de descripcion es N/A (vacio) entonces no se lo agrego
                chop $tribunal_fields[2]; #le saco el ultimo caracter que me caga todo
                $_tribunales{$tribunal_fields[0]} = "$tribunal_fields[1]";
                if( $tribunal_fields[2] ne "N/A" ){
                        $_tribunales{$tribunal_fields[0]} .= " / $tribunal_fields[2]";
                }
        }
        close(DATA);
 
        open(my $data, '<', $exp_output_path) or die "Could not open exp_output ($!)\n";
        while (my $line = <$data>) {
                chomp $line;
                my @fields = split(/;/, $line);
                
                #Filtros
                my $tipo;
                $tipo = identificarTipo($fields[7]);
                if( @tipos ){
                        if ( &contiene( $tipo, @tipos ) == 0) {next;}
                }

                my $urgencia;
                $urgencia = identificarUrgencia($fields[7]);
                if( @urgencias ){
                        if( &contiene( $urgencia, @urgencias) == 0) {next;}
                }

                ($segundos,$minutos,$horas,$dia,$mes,$anio,$wday,$yday,$isdst)=localtime;
                $anio += 1900;
                $mes++;

        #generacion de las lineas

                #primera y segunda linea
                $salida =
"Cámara: $fields[0] - $_camaras{$fields[0]} | Tribunal: $fields[1] - $_tribunales{$fields[1]} | Oficina de Remisión: Mesa de Entradas
Expediente: $fields[2] | Carátula: $fields[3]\n";       
                
                $dia += $urgencia;
                #tercera linea y cuarta linea
                if( $tipo eq "embargo" ) {
                        $salida .=
"Tema: Pedido de Embargo sobre cuenta bancaria | Fecha de Origen: $dia/$mes/$anio | Fojas:1
Extracto: solicítese en carácter de URGENTE la tramitación de embargo sobre la cuenta bancaria asignada en fojas precedentes: CBU Nro: $fields[5]\n\n"
                }
                elsif( $tipo eq "informacion" ) {
                        $salida .=
"Tema: Pedido de Información de saldo sobre cuenta bancaria | Fecha de Origen: $dia/$mes/$anio | Fojas: 1
Extracto: Solicítese a la Entidad Bancaria $fields[0] - $_camaras{$fields[0]} que informe diariamente el saldo de la cuenta bancaria asignada en fojas precedentes CBU Nro: $fields[5]\n\n"                       
                }
                elsif( $tipo eq "liberacion" ) {
                        $salida .=
"Tema: Pedido de Liberación de Embargo sobre cuenta bancaria | Fecha de Origen: $dia/$mes/$anio | Fojas: 1
Extracto: solicítese en carácter de URGENTE la tramitación de liberación de embargo sobre la cuenta bancaria asignada en fojas precedentes: CBU Nro: $fields[5]\n\n"
                }
                elsif( $tipo eq "asignacion" ) {
                        if( $urgencia eq 0 ){
                                $salida .=
"Tema: Pedido de Asignación de Cuenta Bancaria | Fecha de Origen: $dia/$mes/$anio | Fojas: 1
Extracto: solicítese en carácter de URGENTE la Asignación de una NUEVA cuenta bancaria dado que la asignada en fojas precedentes es inválida: $fields[5]\n\n"
                        }
                        elsif( $urgencia eq 1 || $urgencia eq 2 || $urgencia eq 3 || $urgencia eq 4) {
                                $salida .=
"Tema: Pedido de Asignación de Cuenta Bancaria | Fecha de Origen: $dia/$mes/$anio | Fojas: 1
Extracto: solicítese asignación de cuenta bancaria a través de su Clave Bancaria Uniforme ($fields[5]) y pedido de informe diario de saldo sobre dicha cuenta a la entidad bancaria correspondiente\n\n"
                        }
                        else {if($verbose){print "ERROR: urgencia '$urgencia' incorrecta\n\n";}}
                }

                #mode verbose
                if($verbose){print $salida;}
				 #mode report
				if(defined($report)){report_elaboracion('pedido');}
        }
        close($data);          
}

sub report_elaboracion(){
		my($type)=@_;
        $datestring = time();
        open(my $RP,'>>',"$report_path"."/"."$datestring"."-report-"."$type"."\.txt");   
        print {$RP} "$salida";
        close($RP);
}

sub usage(){print "  _____     _____   ______   _________  ________  
 |_   _|   |_   _|.' ____ \ |  _   _  ||_   __  | 
   | |       | |  | (___ \_||_/ | | \_|  | |_ \_| 
   | |   _   | |   _.____`.     | |      |  _| _  
  _| |__/ | _| |_ | \____) |   _| |_    _| |__/ | 
 |________||_____| \______.'  |_____|  |________| \n\n";
 print "
 Usage: perl liste.pl  [options]
 
 Options: 
 
        -h , -help              Muestra la ayuda y sale del programa
        -v, -verbose            Para ver la salida en la pantalla (por defecto, la salida es imprimida)
	-nov, --no-verbose	Para escondir la salida 	
        -r, -report             Para generar un archivo de la salida en un repertorio de REPODIR
                                Ejemplo: -r busqueda1
	-inp, -input		Para eligir el archivo de input a tratar (a poner en REPODIR, por defecto exp_output es usado)
				Ejemplo: -inp archivoAtratar

        Elaboración de Pedidos:
        Una sola y unica opcion debe ser elegida

        -p, -pedidos            Modo de elaboración de pedidos 
        -i, -informes           Modo de elaboración de informes
        
        Filtros: 
        
        -c, -camara             Filtrar por camaras, escribir la/las camara(s) deseada(s) separada(s) por un espacio
                                Ejemplo: -c camara1 camara2 [...] camaraN
                                
        -t, -tribunal           Filtrar por tribunales, escribir el/los tribunale(s) deseado(s) separado(s) por un espacio
                                Ejemplo: -t tribunal1 tribunal2 [...] tribunalN
                                
        -ex, -expediente        Filtrar por expedientes, escribir el/los expediente(s) deseado(s) separado(s) por un espacio
                                Ejemplo: -ex expediente1 expediente2 [...]expedienteN
                                
        -es, -estado            Filtrar por estados, escribir el/los estado(s) deseado(s) separado(s) por un espacio
                                --------------------------------------------------------------------
                                1. REMITIDO||2. A DESPACHO||3. EN CASILLERO||4. SIN CUENTA ASOCIADA
                                5. CUMPLIMIENTO||6. EN GESTION||7. N/D|| 
                                --------------------------------------------------------------------
                                Ejemplo: -es 1 4 3
                                
        -s, -saldo              Filtrar por saldo, eligir un modo de seleccion
                                -------------------------------------------------
                                sin     sin saldo
                                mn X    saldo menor que X
                                mj X    saldo major que X
                                X Y     saldo entre X y Y 
                                -------------------------------------------------
                                Ejemplo: -s  2000 3000
                                
        -tipo                   Filtrar por tipo de pedidos,  escribir el/los tipo(s) de pedidos deseado(s) separado(s) por un espacio
                                -------------------------------------------------
                                embargo
                                informacion     informacion de saldo    
                                liberacion
                                asignacion
                                -------------------------------------------------
                                Ejemplo: -tipo informacion embargo
                                
        -u, -urgencia           Filtrar por urgencias, escribir la/las urgencias deseada(s) separada(s) por un espacio
                                -------------------------------------------------
                                1       por     1 dia
                                2       por     2 dias
                                3       por     3 dias 
                                4       por     4 dias
                                -------------------------------------------------
                                Ejemplo: -u 1 2";
        print "\n\nA desarollar mas\n\n";
        exit;
 }
 
 #generacion del error de mal uso
 sub error(){
        print "Uso incorrecto, por favor consulte la ayuda con el flag -h! \n";
        exit;
}